﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.mtcl
    蒙特卡罗法求复根
    f计算方程左端函数值的函数名。
    参数 z: z根的初值
    参数 b: b均匀分布随机数的端点初值。
    参数 m: 控制调节b的参数。
    参数 eps: 控制精度要求。
    返回值 函数返回根的终值。若程序显示“b调整了100次！迭代不收敛！迭代不收敛！”，则需调整b和m的值再试。
    */

    public static unsafe string drive_mtcl_complex()
    {
        int m;
        double b, eps;
        complex z;
        complex x = new complex(0.5, 0.5);
        b = 1.0;
        m = 10;
        eps = 0.00001;

        double[] xr = new double[1] { x.R };
        double[] xi = new double[1] { x.I };

        gl.f_xa = mtclf;
        int i = gl.mtcl(xr, xi, b, m, eps);

        return gl.html_table("复数解：", new double[2] { xr[0], xi[0] });
    }

    /*
    // 实函数方程
    //要将系数化为复数
    private static complex mtclf(complex x)
    {
        complex z;
        z = x * x - new complex(6.0, 0.0) * x + new complex(13.0, 0.0);
        return (z);
    }
    */
    private static unsafe void mtclf(double* xa)
    {
        complex x = new complex(xa[0], xa[1]);
        complex z;
        z = x * x - new complex(6.0, 0.0) * x + new complex(13.0, 0.0);
        //return (z);
        xa[0] = z.R;
        xa[1] = z.I;
        return;
    }
}